package com.sxj.corejava.code02_jdbc;

import org.apache.commons.dbcp.BasicDataSource;
import org.apache.commons.dbcp.BasicDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.SQLException;
import java.util.Properties;

/**
 * @author 石小俊
 * @date 2023年12月2023/12/2日 15:51
 */
public class Test12_数据库连接池 {

    public static void main(String[] args) throws Exception {
//        test01();
//        test02();
        test03();
    }

    public static void test01() throws SQLException {
        // commons-dbcp的数据库连接池的类
        BasicDataSource ds = new BasicDataSource();
        // 由于数据库连接池是直接与数据库交互的
        // 因此,需要配置访问数据库所需要的常用信息
        ds.setDriverClassName("com.mysql.jdbc.Driver");
        ds.setUrl("jdbc:mysql://127.0.0.1:3306/jdbc?useUnicode=true&characterEncoding=utf-8");
        ds.setUsername("root");
        ds.setPassword("");

        // 配置初始化连接数,即:初始化连接池的时候所申请的数据库连接的数量
        ds.setInitialSize(1);
        // 最大活跃数:表示最多有多少个连接被使用
        ds.setMaxActive(1);
        // 最大空闲连接数:保证连接池中最多存在多少个空闲的连接
        ds.setMaxIdle(1);
        // 最小空闲连接数:保证连接池中至少存在多少个空闲的连接
        ds.setMinIdle(1);
        // 设置等待超时时间:等待获取连接池中连接的时间,如果超出则不再等待直接报错,单位:毫秒
        ds.setMaxWait(3000);

        // 从连接池中获取连接
        Connection conn = ds.getConnection();
        System.out.println(conn);

        // 归还连接,归还到连接池中,便于下一个人使用
        conn.close();

        // 再次获取连接
        Connection conn2 = ds.getConnection();
        System.out.println(conn2);
    }

    public static void test02() throws IOException, SQLException {
        Properties p = new Properties();
        p.load(Test12_数据库连接池.class.getClassLoader().getResourceAsStream("dataSource.properties"));
        System.out.println(p);
        BasicDataSource ds = new BasicDataSource();
        // 由于数据库连接池是直接与数据库交互的
        // 因此,需要配置访问数据库所需要的常用信息
        ds.setDriverClassName(p.getProperty("driverClassName"));
        ds.setUrl(p.getProperty("url"));
        ds.setUsername(p.getProperty("username"));
        ds.setPassword(p.getProperty("password"));

        // 配置初始化连接数,即:初始化连接池的时候所申请的数据库连接的数量
        ds.setInitialSize(Integer.parseInt(p.getProperty("initialSize")));
        // 最大活跃数:表示最多有多少个连接被使用
        ds.setMaxActive(1);
        // 最大空闲连接数:保证连接池中最多存在多少个空闲的连接
        ds.setMaxIdle(1);
        // 最小空闲连接数:保证连接池中至少存在多少个空闲的连接
        ds.setMinIdle(1);
        // 设置等待超时时间:等待获取连接池中连接的时间,如果超出则不再等待直接报错,单位:毫秒
        ds.setMaxWait(3000);

        // 从连接池中获取连接
        Connection conn = ds.getConnection();
        System.out.println(conn);

        // 归还连接,归还到连接池中,便于下一个人使用
//        conn.close();

        // 再次获取连接
        Connection conn2 = ds.getConnection();
        System.out.println(conn2);
    }

    public static void test03() throws Exception {
        Properties p = new Properties();
        p.load(Test12_数据库连接池.class.getClassLoader().getResourceAsStream("dataSource.properties"));
        DataSource ds = BasicDataSourceFactory.createDataSource(p);
        // 从连接池中获取连接
        Connection conn = ds.getConnection();
        System.out.println(conn);

        // 归还连接,归还到连接池中,便于下一个人使用
//        conn.close();

        // 再次获取连接
        Connection conn2 = ds.getConnection();
        System.out.println(conn2);
    }

}
